﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ComunesMGI.DataTypes;
using ClienteWinMGI.Presentacion;
using System.IO;
using ComunesMGI.Enums;
using ComunesMGI.Mensajes;
using ComunesMGI.Condiciones;

namespace ClienteWinMGI.AccesoDatos
{
    class CtrMGIIncidentes:IMGIIncidentes
    {
        #region IMGIIncidentes Members


        public List<DataIncidente> GetIncidentes(int idSis, List<Condicion> condiciones)
        {
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            List<DataIncidente> ret = ws.GetIncidentes(idSis, condiciones);
            ws.Close();
            return ret;
        }


        /// <summary>
        /// Devuelve una coleccion con la informacion de las tareas para el sistema del cliente
        /// </summary>
        /// <param name="cliente">contiene la informacion del cliente</param>
        /// <param name="sistema">contiene la informacion del sistema</param>
        /// <returns>lista de DataTarea</returns>
        public List<DataTarea> GetTareas(int sistema, int  incidente)
        {
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            List<DataTarea> ret = ws.GetTareas(sistema, incidente);
            ws.Close();
            return ret;
        }

        public List<DataCampo> GetCampos(int idSistema, Lista lista)
        {
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            List<DataCampo> ret = ws.GetCampos(idSistema, lista);
            ws.Close();
            return ret;
        }

        /// <summary>
        /// Asigna como responsable al usuario "usuario" de la tarea "tarea" del incidente "incidente"
        /// </summary>
        /// <param name="incidente">datos del incidente</param>
        /// <param name="tarea">datos de la tarea</param>
        /// <param name="usuario">datos del usuario</param>
        /// <returns></returns>
        public bool AsignarResposable(int sistema, int incidente, DataTarea tarea, DataUsuario usuario)
        {
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            bool ret = ws.AsignarResponsable(sistema, incidente, tarea, usuario);
            ws.Close();
            return ret;
        }

        public DataAltaIncidente AddIncidente(DataSistema incidente, List <string> archivos)
        {
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            DataAltaIncidente ret = ws.AddIncidente(incidente);
            if (archivos != null)
            {
                foreach (string path in archivos)
                {
                    FileStream fStream = new FileStream(path, FileMode.Open, FileAccess.Read);
                    string sTmp = ws.UploadFile(fStream);
                    fStream.Close();
                    fStream.Dispose();

                    ws.AdjuntarArchivoIncidente(Path.GetFileName(path), incidente.Codigo, ret.IdIncidente, sTmp);
                }
            }
            ws.Close();
            return ret;
        }


        public int AddWorkPackage(int idSis, DataWP wp)
        {
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            int id=ws.AddWorkPackage(idSis, wp);
            ws.Close();
            return id;
        }

        public List<DataWP> GetWorkPackages(int idSistema)
        {
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            List<DataWP> ret = ws.GetWorkPackages(idSistema);
            ws.Close();
            return ret;
          
        }



        public void AsociarIncidentesWP(int idSis, int idWp, List<int> incidentes)
        {
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            ws.AsociarIncidentesWP(idSis, idWp, incidentes);
            ws.Close();
            
        }

        /// <summary>
        /// Obtiene todos los incidentes cerrados en el sistema de un cliente en un periodo 
        /// </summary>
        /// <param name="cliente">datos del cliente</param>
        /// <param name="sistema">datos del sistema</param>
        /// <param name="fechaDesde">fecha inicio del periodo</param>
        /// <param name="fechaHasta">fecha fin del periodo</param>
        /// <returns></returns>
        public List<DataIncidenteReporte> GetIncidentesCerradosPeriodo(List<int> sistemas, DateTime fechaDesde, DateTime fechaHasta) 
        {
            try
            {
                MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
                ws.Open();
                List<DataIncidenteReporte> ret = ws.GetIncidentesCerradosPeriodo( sistemas, fechaDesde, fechaHasta);
                ws.Close();
                return ret;
            }
            catch (Exception) {
               
                return null;
            }
        }


        /// <summary>
        /// Obtiene todos los incidentes cerrados en el sistema de un cliente en un periodo 
        /// </summary>
        /// <param name="cliente">datos del cliente</param>
        /// <param name="sistema">datos del sistema</param>
        /// <param name="fechaDesde">fecha inicio del periodo</param>
        /// <param name="fechaHasta">fecha fin del periodo</param>
        /// <returns></returns>
        public List<DataIncidenteReporte> GetIncidentesCreadosPeriodo(List<int> sistemas, DateTime fechaDesde, DateTime fechaHasta)
        {
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            List<DataIncidenteReporte> ret = ws.GetIncidentesCreadosPeriodo(sistemas, fechaDesde, fechaHasta);
            ws.Close();
            return ret;
        }
        
       
        public List<DataIncidente> GetIncidentesWP(int idSis, int idWp) 
        {
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            List<DataIncidente> lista = ws.GetIncidentesWP(idSis, idWp);
            ws.Close();
            return lista;
          
        }

        public List<DataEstadoWP> GetEstadosWP()
        {
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            List<DataEstadoWP> lista = ws.GetEstadosWP();
            ws.Close();
            return lista;
        }

        public bool ChkWPIncidentesOTareasSinCerrar(int idWP)
        {
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            bool sinCerrar=ws.ChkWpIncidentesOTareasSinCerrar(idWP);
            ws.Close();
            return sinCerrar;



        
        }

        public void ModificarWP(DataWP wp, bool cerrarTodo)
        { 
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            ws.ModificarWP(wp,cerrarTodo);
            ws.Close();
           
            
        }

        public List<DataIncidenteReporte> VisualizarIncidentesAsignados(List<int> idSis,string usr, string estado, DateTime fechaDesde, DateTime fechaHasta)
        {
            try
            {
                MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
                ws.Open();
                List<DataIncidenteReporte> ret = ws.VisualizarIncidentesAsignados(idSis, usr, estado,fechaDesde, fechaHasta);
                ws.Close();
                return ret;
            }
            catch (Exception)
            {
                return null;
            }
            
        }

        public List<DataIncidente> GetIncidentesAsignablesWP(int wkpCod)
        {
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            List<DataIncidente> ret = ws.GetIncidentesAsignablesWP(wkpCod);
            ws.Close();
            return ret;
        
        }

        public DataAltaTarea AddTarea(int siscod, int idIncidente, List<DataCampo> campos)
        {
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            DataAltaTarea ret = ws.AddTarea(siscod, idIncidente, campos);
            ws.Close();
            return ret;
        }

        public DataIncidenteConCampos GetIncidente(int idIncidente, int idSistema)
        {

            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            DataIncidenteConCampos ret = ws.GetIncidente(idIncidente,idSistema);
            ws.Close();
            return ret;
        }


        public void ModificarIncidente(int idSistema,DataIncidenteConCampos incidente)
        {
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            ws.ModificarIncidente(idSistema,incidente);
            ws.Close();
        }

        public List<DataWPReporte> GetWorkPackagesDadosAltaPeriodo(List<int> sistemas, DateTime perFchIni, DateTime perFchFin)
        {
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            List<DataWPReporte> dataWPRep= ws.GetWorkPackagesDadosAltaPeriodo(sistemas, perFchIni, perFchFin);
            ws.Close();
            return dataWPRep;
        }

        #endregion
    }
}
